package redes;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;

import model.Deme;

public class RedePoisson extends Rede{
	
	public RedePoisson(int quantidadeDemes, int tamanhoPopulacaoLocal, Random raiz, double z) {
		super(quantidadeDemes, tamanhoPopulacaoLocal, raiz);
		init(z);
	}
	
	private void init(double z){
		int tam = matrizDeVizinhanca.length;
		double p = z/tam;
		int numConexoes = (int) ((p/2)*(tam-1)*tam);
		
		for(int i= 0; i< numConexoes; ){
			int rotuloX = getRandom().nextInt(tam);
			int rotuloY = getRandom().nextInt(tam);
			while(rotuloY == rotuloX) rotuloY = getRandom().nextInt(tam);
			
			if(!existeConexao(rotuloX, rotuloY)){
				matrizDeVizinhanca[rotuloX][rotuloY] = true;
				matrizDeVizinhanca[rotuloY][rotuloX] = true;
				vizinhos[rotuloX].add(demes.get(rotuloY));
				vizinhos[rotuloY].add(demes.get(rotuloX));
				i++;
			}
		}
	}

	@Override
	public Iterator<Deme> getIterator() {
		ArrayList<Deme> resp = new ArrayList<Deme>();
		ArrayList<Deme> fila = new ArrayList<Deme>();
		int total = demes.size();
		
		int atual;
		do{
			atual = random.nextInt(total);
		}while(getQuantidadeVizinho(atual) == 0);
		
		resp.add(demes.get(atual));
		fila.add(demes.get(atual));
		
		while(fila.size() != 0){
			atual = fila.get(0).getRotulo();
			
			for(Deme d : getVizinhos(atual)){
				if(!resp.contains(d)){
					resp.add(d);
					fila.add(d);
				}
			}
			fila.remove(0);
		}

		return resp.iterator();
	}
}
